package com.example.designpattern.singleton;

/**
 * 加了锁，并且进行了双重检查，线程安全的饱汉模式，但不是完美的，还有问题
 */
public class SafeFullSingletonPatternDemo {
    public static void main(String[] args) {

    }
    // 不是完美的
    // 因为不同的JVM的编译器的问题，可能导致说，这个情况下，还是线程不安全的
    // 具体的我不再这儿讲，因为涉及到复杂的JVM内部的原理
    public static class Singleton {
        private static Singleton instance;
        private Singleton () {

        }
        public static Singleton getInstance(){
            if(instance==null){
                //只有拿到这个类的锁才能进入这个代码块
                synchronized (SafeFullSingletonPatternDemo.class){
                    //双重检查，线程A 和 线程B 都有可能在同一个时刻通过第一个判断，当线程A首先拿到锁进入执行完毕后，释放锁；
                    //此时线程B 拿到锁，进入，如果没有第二次判断，那就再次创建实例了，不再是单例了；
                    if(instance==null){
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
}
